x86: fix page refcount handling in page table pin error path
authorJan Beulich <jbeulich@suse.com>
Wed, 26 Jun 2013 13:32:58 +0000 (15:32 +0200)
committerJan Beulich <jbeulich@suse.com>
Wed, 26 Jun 2013 13:32:58 +0000 (15:32 +0200)
commit9b167bd2f394f821ae3252d74a15704a4bf91f6d
treebf628c65f125463b064fd11988135b8233609b35
parentcb9ac9fda371beee0ec7753841684063cebe1da3
x86: fix page refcount handling in page table pin error path

In the original patch 7 of the series addressing XSA-45 I mistakenly
took the addition of the call to get_page_light() in alloc_page_type()
to cover two decrements that would happen: One for the PGT_partial bit
that is getting set along with the call, and the other for the page
reference the caller hold (and would be dropping on its error path).
But of course the additional page reference is tied to the PGT_partial
bit, and hence any caller of a function that may leave
->arch.old_guest_table non-NULL for error cleanup purposes has to make
sure a respective page reference gets retained.

Similar issues were then also spotted elsewhere: In effect all callers
of get_page_type_preemptible() need to deal with errors in similar
ways. To make sure error handling can work this way without leaking
page references, a respective assertion gets added to that function.

This is CVE-2013-1432 / XSA-58.

Reported-by: Andrew Cooper <andrew.cooper3@citrix.com>
Signed-off-by: Jan Beulich <jbeulich@suse.com>
Tested-by: Andrew Cooper <andrew.cooper3@citrix.com>
Reviewed-by: Tim Deegan <tim@xen.org>
xen/arch/x86/domain.c
xen/arch/x86/mm.c
xen/include/asm-x86/mm.h